package org.jeecg.modules.online.cgform.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.jeecg.modules.online.cgform.entity.OnlCgformField;
import org.jeecg.modules.online.cgform.enums.CgformValidPatternEnum;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * online 导入校验工具类
 */
public class OnlineImportValidator {

    /**
     * 正则校验的 字段
     */
    private Map<String, OnlCgformField> fieldRegex;
    /**
     * 必填校验的字段 JTC-317【online导入】校验不起作用
     */
    private Map<String, OnlCgformField> fieldNotNull;
    /**
     * 验证信息连接符
     */
    private static final String COMMA = ",";

    /**
     * 校验行提示
     */
    private static final String ROW_TIP = "第%s行校验信息:";

    /**
     * 校验弹框提示
     */
    private static final String VALIDATE_POP_TIP = "总上传行数:%s,已导入行数:%s,错误行数:%s";

    /**
     * 导入返回map error信息的key
     */
    public static final String ERROR = "error";

    /**
     * 导入返回map 行数信息的key
     */
    public static final String TIP = "tip";

    /**
     * 错误文件地址 key
     */
    public static final String FILEPATH = "filePath";

    public OnlineImportValidator(){

    }

    /**
     * 构造器 将需要校验的字段过滤出来
     * @param fieldList
     */
    public OnlineImportValidator(List<OnlCgformField> fieldList){
        fieldRegex = new HashMap<String, OnlCgformField>();
        fieldNotNull = new HashMap<String, OnlCgformField>();
        for(OnlCgformField field: fieldList){
            String validateType = field.getFieldValidType();
            if(validateType!=null && !"".equals(validateType) && !CgformValidPatternEnum.ONLY.getType().equals(validateType)){
                //唯一校验交给数据库自己， 非空设置到另一个map fieldNotNull
                if(CgformValidPatternEnum.NOTNULL.getType().equals(validateType)){
                    fieldNotNull.put(field.getDbFieldName(), field);
                }else{
                    fieldRegex.put(field.getDbFieldName(), field);
                }
            }
            if(field.getDbIsNull() == 0 || "1".equals(field.getFieldMustInput())){
                // 必填校验
                fieldNotNull.put(field.getDbFieldName(), field);
            }
        }
    }


    /**
     * 根据当前数据 走校验，如果校验无问题 返回null
     * @param dataString
     * @param index
     * @return
     */
    public String doValidate(String dataString, int index){
        StringBuffer msg = new StringBuffer();
        JSONObject json = JSON.parseObject(dataString);
        // update-begin-author:taoyan date:20220113 for: JTC-317 【online导入】校验不起作用
        // 非空校验处理
        for(String key: fieldNotNull.keySet()){
            String value = json.getString(key);
            OnlCgformField field = fieldNotNull.get(key);
            //非空校验
            if(value==null || "".equals(value)){
                msg.append(field.getDbFieldTxt()+CgformValidPatternEnum.NOTNULL.getMsg()+COMMA);
            }
        }
        //正则校验处理
        for(String key: fieldRegex.keySet()){
            String value = json.getString(key);

            OnlCgformField field = fieldRegex.get(key);
            String validateType = field.getFieldValidType();
            // 以下校验需要实际值不为空 如果为空不走下面校验逻辑
            if(value==null || "".equals(value)){
                continue;
            }
            String regex = null, typeEnumMsg=null;
            if(CgformValidPatternEnum.INTEGER.getType().equals(validateType)){
                regex = "^-?[1-9]\\d*$";
                typeEnumMsg = "请输入整数";
            }else{
                CgformValidPatternEnum typeEnum = CgformValidPatternEnum.getPatternInfoByType(validateType);
                if(typeEnum==null){
                    regex = validateType;
                    typeEnumMsg = "校验【"+regex+"】未通过";
                }else{
                    regex = typeEnum.getPattern();
                    typeEnumMsg = typeEnum.getMsg();
                }
            }
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(value);
            if(!m.find()){
                msg.append(field.getDbFieldTxt()+typeEnumMsg+COMMA);
            }
        }
        // update-end-author:taoyan date:20220113 for: JTC-317 【online导入】校验不起作用
        if(msg.length()>0){
            return formatTipMessage(msg.toString(), index);
        }else{
            return null;
        }
    }

    /**
     * 格式化 错误提示信息
     * @param msg
     * @param index
     * @return
     */
    public static String formatTipMessage(String msg, int index){
        return String.format(ROW_TIP, index)+msg+"\r\n";
    }

    /**
     * 格式化 弹框提示成功多少行 错误多少行
     * @param all
     * @param error
     * @return
     */
    public static String formatPopMessage(int all, int error){
        int success = all - error;
        return String.format(VALIDATE_POP_TIP, all, success, error);
    }

}
